package com.crazymakercircle.imServer.server.session.dao.impl;


import com.crazymakercircle.imServer.server.session.dao.UserCacheDAO;
import com.crazymakercircle.imServer.server.session.entity.SessionCache;
import com.crazymakercircle.imServer.server.session.entity.UserCache;
import com.crazymakercircle.util.JsonUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

/**
 *  create by 事了拂衣去
 **/
@Repository("UserCacheRedisImpl")
public class UserCacheRedisImpl implements UserCacheDAO
{

    public static final String REDIS_PREFIX = "UserCache:uid:";/*用途：定义 Redis 缓存键的前缀常量。
意义：保证 Redis 键命名的一致性，避免冲突。*/

    @Autowired
    protected StringRedisTemplate stringRedisTemplate;/*用途：声明一个 StringRedisTemplate 实例变量，用于操作 Redis。
意义：提供对 Redis 数据库的访问能力，例如存储、查询和删除数据。*/

    private static final long CASHE_LONG = 60 * 4;//4小时之后，得重新登录


    @Override
    public void save(final UserCache uss)/*用途：定义保存用户缓存的方法。将 UserCache 对象转换为 JSON 字符串，并存储到 Redis 中，设置过期时间。*/
    {
        String key = REDIS_PREFIX + uss.getUserId();
        String value = JsonUtil.pojoToJson(uss); /*将缓存用户转化为 json ，便于Redis存储和传输*/
        stringRedisTemplate.opsForValue().set(key, value, CASHE_LONG, TimeUnit.MINUTES);
         /*调用 Redis 操作 API，存储带有过期时间的键值对；  实现用户缓存的持久化存储，并自动清理过期数据*/
    }


    @Override
    public UserCache get(final String usID)
    {
        String key = REDIS_PREFIX + usID;
        String value = (String) stringRedisTemplate.opsForValue().get(key);

        if (!StringUtils.isEmpty(value))
        {
            return JsonUtil.jsonToPojo(value, UserCache.class); /*反序列化 恢复原始数据结构，便于后续处理*/
        }
        return null;
    }


    @Override
    public void addSession(String uid, SessionCache session)/*向用户的缓存中添加一个新的会话*/
    {
        UserCache us = get(uid);
        if (null == us)
        {
            us = new UserCache(uid); /*确保即使用户无缓存也能安全地添加新会话。*/
        }

        us.addSession(session);  /* /*调用 addSession 方法，将新的会话加入用户缓存。意义：更新用户缓存内容*/
        save(us);  /*将更新后的用户缓存保存回 Redis。*/
    }

    @Override
    public void removeSession(String uid, String sessionId)
    {
        UserCache us = get(uid);
        if (null == us)
        {
            us = new UserCache(uid); /*确保即使用户无缓存也能安全地删除会话。*/
        }
        us.removeSession(sessionId);// 调用 removeSession 方法，从用户缓存中移除指定的会话
        save(us);  /*将更新后的用户缓存保存回 Redis。意义：使更改持久化。*/
    }

}